package com.smartcruise.util.pushUtil;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

import com.google.gson.Gson;
import com.smartcruise.MyApplication;
import com.smartcruise.data.PushData;
import com.smartcruise.data.cruiseData.CruiseContract;
import com.smartcruise.data.cruiseData.CruiseData;
import com.smartcruise.util.Key;
import com.smartcruise.util.SPUtils;
import com.smartcruise.util.TempleUser;
import com.smartcruise.util.Utils;
import com.smartcruise.util.network.callBack.BaseCallBack;
import com.smartcruise.util.network.netUtils.NetCollection;
import com.smartcruise.util.network.netUtils.Result;

import cn.jpush.android.api.JPushInterface;
import io.realm.Realm;

/**
 * 自定义接收器
 * <p>
 * 如果不定义这个 Receiver，则：
 * 1) 默认用户会打开主界面
 * 2) 接收不到自定义消息
 */
public class PushReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            Bundle bundle = intent.getExtras();
            if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
                String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
                receiveRegisteredId(intent);
            } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
                receiveCustomMessage(intent);
            } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
                receiveNotification(intent);
            } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
                receiveClickedNotification(intent);
            } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
                //在这里根据 JPushInterface.EXTRA_EXTRA 的内容处理代码，比如打开新的Activity， 打开一个网页等..
            } else if (JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) {
                boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false);
                receiveConnectStatus(intent);
            }
            Log.d("PushReceiver", "bundle:" + bundle);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * description:SDK 向 JPush Server 注册所得到的注册 ID 。
     * 一般来说，可不处理此广播信息。
     * 要深入地集成极光推送，开发者想要自己保存App用户与JPush 用户关系时，则接受此广播，
     * 取得 Registration ID 并保存与App uid 的关系到开发者自己的应用服务器上。
     * 使用极光推送提供的别名与标签功能，是更加简单轻便的绑定App用户与JPush用户的方式
     */

    private void receiveRegisteredId(Intent intent) {

    }

    /**
     * description:收到了自定义消息 Push 。
     * SDK 对自定义消息，只是传递，不会有任何界面上的展示。
     * 如果开发者想推送自定义消息 Push，则需要在 AndroidManifest.xml 里配置此 Receiver action,
     * 并且在自己写的 BroadcastReceiver 里接收处理。
     */
    private void receiveCustomMessage(Intent intent) {
        Bundle bundle = intent.getExtras();
        if (bundle == null) {
            return;
        }
        String message = bundle.getString(JPushInterface.EXTRA_MESSAGE);
        onReceiveNewMessage(message);

        Log.d("PushReceiver", "custom message:" + message);
    }

    /**
     * description:收到了通知 Push。
     * 如果通知的内容为空，则在通知栏上不会展示通知。
     * 但是，这个广播 Intent 还是会有。开发者可以取到通知内容外的其他信息。
     */

    private void receiveNotification(Intent intent) {
        Bundle bundle = intent.getExtras();
        if (bundle == null) {
            return;
        }
        String content = bundle.getString(JPushInterface.EXTRA_ALERT);
        Log.d("PushReceiver", "receiveNotification:" + content);
    }

    /**
     * description:用户点击了通知。 一般情况下，用户不需要配置此 receiver action。
     * 如果开发者在 AndroidManifest.xml 里未配置此 receiver action，那么，
     * SDK 会默认打开应用程序的主 Activity，相当于用户点击桌面图标的效果。
     * 如果开发者在 AndroidManifest.xml 里配置了此 receiver action，
     * 那么，当用户点击通知时，SDK 不会做动作。开发者应该在自己写的 BroadcastReceiver 类里处理，比如打开某 Activity 。
     */

    private void receiveClickedNotification(Intent intent) {

    }

    /**
     * description:JPush 服务的连接状态发生变化。（注：不是指 Android 系统的网络连接状态。）
     */

    private void receiveConnectStatus(Intent intent) {

    }

    private void onReceiveNewMessage(String message) {
        Gson gson = new Gson();
        final PushData pushData = gson.fromJson(message, PushData.class);
        if (!PushData.TYPE_DEVICE_LOGIN.equals(pushData.getType()) ||
                !PushData.TYPE_REVOKE_TASK.equals(pushData.getType())) {//终端设备上线 这条记录不存储
            pushData.setUnRead(true);
            try (Realm realm = Realm.getDefaultInstance()) {
                realm.executeTransaction(new Realm.Transaction() {
                    @Override
                    public void execute(Realm realm) {
                        realm.copyToRealmOrUpdate(pushData);
                    }
                });
            }
        }
        switch (pushData.getType()) {
            case PushData.TYPE_NEW_TASK:
                NotificationUtils.showNewTaskNotification(pushData.getContent(), pushData.getRelatedId());
                NetCollection.getOneNewTaskBack(pushData.getRelatedId());
                break;
            case PushData.TYPE_TASK_AUDIT_RESULT:
                NotificationUtils.showTaskAuditedNotification(pushData.getContent(), pushData.getRelatedId());
                NetCollection.getOneAuditedTaskBack(pushData.getRelatedId());
                break;
            case PushData.TYPE_REPORT_AUDIT_RESULT:
                NotificationUtils.showReportAuditedNotification(pushData.getContent(), pushData.getRelatedId());
                NetCollection.getOneAuditedReportBack(pushData.getRelatedId());
                break;
            case PushData.TYPE_DEVICE_LOGIN:
                checkLogin(pushData);
                break;
            case PushData.TYPE_REVOKE_TASK:
                revokeTask(pushData);
                break;
        }

    }

    /**
     * description:检查登录信息 如果返回的设备id和当前的设备id不同 则被踢下线
     */

    private void checkLogin(PushData pushData) {
        if (!pushData.getRelatedId().equals(Utils.getAndroidId())) {
            SPUtils.setIsQuit(true);
            MyApplication.getInstance().kitOut();
        }
    }

    /**
     * description:撤回任务
     */

    private void revokeTask(PushData pushData) {
        final String taskId = pushData.getRelatedId();
        try (Realm realm = Realm.getDefaultInstance()) {
            realm.executeTransaction(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
                    //先删除原任务
                    realm.where(CruiseData.class)
                            .equalTo(Key.inspectorId, TempleUser.getInstance().getAccount())
                            .equalTo(Key.patrollingTaskId, taskId)
                            .equalTo(Key.isCopyData, false)
                            .equalTo(Key.isFromNet, false)
                            .findAll().deleteAllFromRealm();
                    //再删除尚未开始的本地任务
                    realm.where(CruiseData.class)
                            .equalTo(Key.inspectorId, TempleUser.getInstance().getAccount())
                            .equalTo(Key.patrollingTaskId, taskId)
                            .equalTo(Key.isCopyData, true)
                            .equalTo(Key.isFromNet, false)
                            .equalTo(Key.statusInApp, CruiseContract.TASK_IS_WAIT_START)
                            .findAll().deleteAllFromRealm();
                }
            });
        }
        NetCollection.revokeTaskOk(taskId, new BaseCallBack() {
            @Override
            public void onSuccess(Result result) {

            }

            @Override
            public void onFail(Result result) {

            }

            @Override
            public void onError(Throwable e) {

            }
        });
    }
}
